import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType}

name := "mtd"

version := "0.1"

lazy val scalaVer = "2.13.5"
scalaVersion := scalaVer

lazy val server = (project in file("server"))
  .settings(commonSettings)
  .settings(
    scalaJSProjects := Seq(client),
    name := "mtd",
    version := "1.0",
    pipelineStages in Assets := Seq(scalaJSPipeline),
    pipelineStages := Seq(digest, gzip),
    compile in Compile := ((compile in Compile) dependsOn scalaJSPipeline).value,
    libraryDependencies ++= Seq(
      "com.vmunier" %% "scalajs-scripts" % "1.1.4",
      guice,
      specs2 % Test,
      ws,
      ehcache,
      "com.typesafe.play" %% "play-slick" % "4.0.2",
      "com.typesafe.slick" %% "slick-codegen" % "3.3.2",
      "mysql" % "mysql-connector-java" % "8.0.21",
      "com.github.tototoshi" %% "slick-joda-mapper" % "2.4.1",
      "commons-io" % "commons-io" % "2.5",
      "org.apache.poi" % "poi-ooxml" % "3.15",
      "org.apache.commons" % "commons-math3" % "3.6.1",
      "com.aliyun" % "aliyun-java-sdk-core" % "3.7.1",
      "com.aliyun" % "aliyun-java-sdk-dysmsapi" % "1.1.0",
      "com.typesafe.play" %% "play-joda-forms" % "2.7.3",
      "org.apache.xmlgraphics" % "batik-codec" % "1.10",
      "org.zeroturnaround" % "zt-zip" % "1.11",
      "com.github.tototoshi" %% "scala-csv" % "1.3.6",
      "junit" % "junit" % "4.12" % Test,
      "org.apache.pdfbox" % "pdfbox" % "2.0.8",
      "org.apache.pdfbox" % "pdfbox-tools" % "2.0.8",
      "org.scalaz" %% "scalaz-core" % "7.2.29",
      "org.scalaz" %% "scalaz-effect" % "7.2.29",
      "com.h2database" % "h2" % "1.4.199",
      "javax.xml.bind" % "jaxb-api" % "2.3.0",
      "org.apache.commons" % "commons-lang3" % "3.6",
      "org.scala-lang.modules" %% "scala-parallel-collections" % "0.2.0",
      "org.typelevel" %% "cats-core" % "2.0.0",
      "javax.mail" % "mail" % "1.4.7",
      "org.scala-lang" % "scala-reflect" % "2.13.1",
      "com.github.tminglei" %% "slick-pg" % "0.19.0",
      "com.github.tminglei" %% "slick-pg_joda-time" % "0.19.0",
      "com.github.tminglei" %% "slick-pg_play-json" % "0.19.0",
      "com.github.tminglei" %% "slick-pg_jts" % "0.19.0",
      "cn.edu.hfut.dmic.webcollector" % "WebCollector" % "2.61" exclude ("org.slf4j", "slf4j-log4j12"),
      "net.ruippeixotog" %% "scala-scraper" % "2.2.1",
      "com.chuusai" %% "shapeless" % "2.3.3",
      "com.lihaoyi" %% "upickle" % "2.0.0",
      "com.lihaoyi" %% "ujson-play" % "2.0.0"
    ),
    scalacOptions ++= {
      Seq("-Ymacro-annotations")
    }
  )
  .enablePlugins(PlayScala, WebScalaJSBundlerPlugin)
  .dependsOn(sharedJvm)

val reactVersion = "17.0.2"

lazy val client = (project in file("client"))
  .settings(commonSettings)
  .settings(
    scalaJSUseMainModuleInitializer := false,
    resolvers += "jitpack" at "https://jitpack.io",
    libraryDependencies ++= Seq(
      "com.lihaoyi" %%% "scalatags" % "0.11.1",
      "me.shadaj" %%% "slinky-core" % "0.7.3",
      "me.shadaj" %%% "slinky-web" % "0.7.3",
      "com.lihaoyi" %%% "upickle" % "2.0.0",
      "org.scala-js" %%% "scala-js-macrotask-executor" % "1.0.0",
      "com.github.japgolly.scalajs-react" %%% "core-bundle-cats_effect" % "2.1.1",
      "com.github.japgolly.scalajs-react" %%% "extra" % "2.1.1"
    ),
    Compile / npmDependencies ++= Seq(
      "react" -> reactVersion,
      "@types/react" -> reactVersion,
      "d3" -> "4.13.0",
      "webpack-merge" -> "4.2.2",
      "jquery" -> "3.5.0",
      "react-hook-form" -> "7.37.0",
      "react-dom" -> reactVersion,
      "react-select" -> "5.4.0",
      "bootstrap-sweetalert" -> "1.0.1",
      "layer-src" -> "3.5.1",
      "react-i18next" -> "11.16.2",
      "react-bootstrap" -> "2.8.0",
      "xlsx" -> "0.18.5",
    ),
    scalacOptions ++= {
      Seq(
        "-Ymacro-annotations"
      )
    },
    webpackBundlingMode := BundlingMode.LibraryAndApplication(),
    webpackConfigFile := Some(
      baseDirectory.value / "my.custom.webpack.config.js"
    )
  )
  .enablePlugins(ScalaJSBundlerPlugin)
  .dependsOn(sharedJs)

lazy val shared = crossProject(JSPlatform, JVMPlatform)
  .crossType(CrossType.Pure)
  .in(file("shared"))
  .settings(commonSettings)
  .settings(
    scalacOptions ++= {
      Seq("-Ymacro-annotations")
    },
    libraryDependencies ++= Seq(
      "io.github.alexarchambault" %% "data-class" % "0.2.1",
      "com.lihaoyi" %% "upickle" % "2.0.0",
      "joda-time" % "joda-time" % "2.10.5"
    )
  )

lazy val sharedJvm = shared.jvm
lazy val sharedJs = shared.js

lazy val commonSettings = Seq(
  scalaVersion := scalaVer
)

onLoad in Global := (onLoad in Global).value andThen { s: State => "project server" :: s }
